
#ifndef NETIF_MAX_HWADDR_LEN
#define NETIF_MAX_HWADDR_LEN 6U
#endif

enum lwip_internal_netif_client_data_index {
#if LWIP_IPV4
#if LWIP_DHCP
    LWIP_NETIF_CLIENT_DATA_INDEX_DHCP,
#endif
#if LWIP_AUTOIP
    LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP,
#endif
#if LWIP_IGMP
    LWIP_NETIF_CLIENT_DATA_INDEX_IGMP,
#endif
#endif /*LWIP_IPV4*/

    LWIP_NETIF_CLIENT_DATA_INDEX_MAX
};

typedef err_t (*netif_input_fn)(struct pbuf* p, struct netif* inp); //现在netif_input_fn就代表这样一个函数指针类型

#if LWIP_IPV4

/**
 *  @param netif The netif which shall send a packet
 *  @param p The packet to send (p->payload points to IP header)
 *  @param ipaddr The IP address to which the packet shall be send 
 */
typedef err_t (*netif_output_fn)(struct netif* netif, struct pbuf* p, const ipv4_addr_t* ipaddr); //函数指针
    //这里是一个结构体指针
#endif /*LWIP_IPV4*/

/**
 *  @param netif The netif which shall send a packet
 *  @param p The packet to send (raw ethernet packet) 
 */
typedef err_t (*netif_linkoutput_fn)(struct netif* netif, struct pbuf* p);
typedef void (*netif_status_callback_fn)(struct netif* netif);

struct netif {
#if !LWIP_SINGLE_NETIF
    /*指向netif链表中的下一个*/
    struct netif* next;
#endif

#if LWIP_IPV4
    /*网络字节中的IP地址,子网掩码,默认网关配置*/
    ip_addr_t ip_addr; //这里是一个结构体
    ip_addr_t netmask;
    ip_addr_t gw;
#endif /*LWIP_IPV4*/
    /**
 *  This function is called by the network device driver
 *  to pass a packet up the TCP/IP stack(协议栈) 
 */
    netif_input_fn input; //将数据从PHY往上层送

#if LWIP_IPV4

    netif_output_fn output; //这个玩意儿是指向某个函数的
#endif /*LWIP_IPV4*/

    netif_linkoutput_fn linkoutput;

#if LWIP_NETIF_STATUS_CALLBACK
    netif_status_callback_fn status_callback;
#endif

#if LWIP_NETIF_LINK_CALLBACK
    netif_status_callback_fn link_callback;
#endif

#if LWIP_NETIF_REMOVE_CALLBACK
    netif_status_callback_fn remove_callback;
#endif

    void* state;

#ifdef netif_get_client_data
    void* client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + LWIP_NUM_NETIF_CLIENT_DATA];
#endif

#if LWIP_NETIF_HOSTNAME
    const char* hostname;
#endif

#if LWIP_CHECKSUM_CTRL_PER_NETIF
    u16_t chksum_flags;
#endif

    u16_t mtu; //最大传输单位(以字节为单位),对于以太网一般设置为1500

    u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; //网卡链路层硬件地址

    u8_t hwaddr_len; //硬件地址长度,对于以太网就是MAC地址长度,为6字节

    u8_t flags; //

    char name[2]; //保存每一个网卡的名字,如果有相同的网络名字,就用num字段来区分相同类别的不同网卡

    u8_t num; //用来标示使用同种驱动类型的不同网卡

#if MIB2_STATS
    u8_t link_type; /*连接类型*/

    u32_t link_speed; //连接速度

    u32_t ts; //最后一次更改的时间戳

    struct stats_mib2_netif_ctrs mib2_counters; //别炫耀你的学历,和你的成绩！！
#endif //MIB2_STATS

#if LWIP_IPV4 && LWIP_IGMP
    /*可以调用此函数来添加或删除多播中的条目 以太网MAC的过滤表*/
    netif_igmp_mac_filter_fn igmp_mac_filter;
#endif /*LWIP_IPV4 && LWIP_IGMP*/

#if LWIP_NETIF_USE_HINTS
    struct netif_hint* hints;
#endif /*LWIP_NETIF_USE_HINTS*/

#if ENABLE_LOOPBACK
    /*list of packets to be queued for ourselves*/
    struct pbuf* loop_first;
    struct pbuf* loop_last;
#if LWIP_LOOPBACK_MAX_PBUFS
    u16_t loop_cnt_current;
#endif /*LWIP_LOOPBACK_MAX_PBUFS*/

#endif /*ENABLE_LOOPBACK*/
}